4.3 替换、拆分匹配成功的值
1、在正则表达式中,可以对匹配成功的的字符串进行替换处理,既可以替换为普通字符串, 也可以是有特殊字符的正则表达式,还可以是函数。
(1)普通替换
(2)正则表达式中分组的替换
(3)替换时函数用法
import re
text= "小张34小明16欧阳大明45小曾32"
t1=re.sub( "\d+","、" ,text)
t2=re.sub( "(\d+)" ,r "\1、" ,text)
#只有一个分组,所以只写个\1
t3=re.sub( "\d+" , lambda m:m[0]+ "、" ,text)
#第一个m相当限返回一个match对象,m[0]表标获取里面的值
print (t1)
print (t2)
print (t3)
返回:
小张、小明、欧阳大明、小曾、
小张34、小明16、欧阳大明45、小曾32、
小张34、小明16、欧阳大明45、小曾32、
2、拆分匹配成功的值
在python中虽然可以使用split()函数执行拆分,但没有正则表达式中的split()函数灵活,使用正则表达式拆分函数返回的是列表
正则表达式字符串就是拆分的分隔符,如果在正则表达式字符串捕获到有使用括号进行分组,那么所有的分组里的内容也会返回到列表里。
import re
text= "小张34-小明16-欧阳大明45-小曾32"
txt= "小张34小明16欧阳大明45小曾32"
t1=text.split( "-" )
t2=re.split( "\d+" ,txt)
t3=re.split( "(\d+)" ,txt)
t4=re.compile( "(\d+)" ).split(txt,2)
print (t1)
print (t2)
print (t3)
print (t4)
返回:
['小张34', '小明16', '欧阳大明45', '小曾32']
['小张', '小明', '欧阳大明', '小曾', '']
['小张', '34', '小明', '16', '欧阳大明', '45', '小曾', '32', '']
['小张', '34', '小明', '16', '欧阳大明45小曾32']
3、编译正则表达式
Re.compile()函数用于编译正则表达式,它将正则表达式转化为对象,生成一个re.Patten对象
关于re.compile函数参数说明如下
Re.compile(patten[,flags])
Patten:一个字符串的正则表达式
Flags:可选,可匹配模式,比如忽略大小写,多行模式等,默认参考为re.unicode
可是使用字符“|”表时同时生效,也可以在正则表达式字符串中指定,re.patten对象不能直接实例化, 只能通过compile()函数得到。
完整写法 | 简写 | 内联标记 | 注释 |
---|---|---|---|
Re.ASCII | re.A | (?a) | 表示\w、\W、\b、\B、\d、\D、\s、\S只匹配ASCII而不是unicode,区配256个字符,但不包括汉字 |
Re.unicode | re.U | (?u) | 表示\w、\W、\b、\B、\d、\D、\s、\S依赖于unicode字符库 |
Re.ignorecase | ire.l | (?i) | 进行大小写忽略匹配,比如表达式中匹配小写字母,但实际也会匹配大写字母 |
Re.multiline | re.M | (?m) | 多行模式,”^”匹配整个字符串的开始,和每一行开始,$匹配整个字符串结尾,和每一行结尾 |
Re.dotall | re.S | (?s) | 让“.”特殊字符匹配任何字符,包括换行符,如没有此标记,“.”就匹配换行符的其他任意字符 |
Re.verbose | re.X | (?x) | 允许编写更具可读性更友好的正则表达式,忽略空格和#后面的注释。 |
4、特殊斜杠
\是一个具有特殊用法的的普通符号,常见用法如下
(1)在普通字符串中表现特殊的空白字符
\t | 模向制表符 |
\n | 换行符 |
\r | 回车符 |
\f | 换页符 |
\v | 纵向制表符 |
(2)在普通字符串中表现特殊的空白字符
如果要还原为\原本的字符效果,则再在\前再添加\,表示:\\
(3)也可以在字符串左则添加r实现批量转换
(4)在正则表达式字符串中添加“\”,达到转换为特殊字符,或者将具有特殊作用的字符转为普通字符。
4、单字符(元字符)
匹配字符 | 注释 |
---|---|
\d | 匹配数字,相当于[0-9] |
\D | 匹配任何非数字的字符,与\d相反,相当于[^0-9] |
\w | 匹配unicode字符,包括数字和下划线,如果设置为ASCII模式就只匹配[a-zA-Z0-9] |
\W | 匹配非unicode字符,与\w相反,如果设置为ASCII模式就只匹配[^a-zA-Z0-9] |
\s | 匹任何unicode空白字符,如果设置为ASCII模式就只匹配[\t\n\r\f\v] |
\S | 匹任何unicode非空白字符,如果设置为ASCII就相当于[^\t\n\r\f\v]•(点)在默认情况下, 匹配除换行之外的任意字符。如果设置为re.dotall模式,它将匹配包括换行符的任意字符。 |
5、单字符(单字符或关系)
字符组的字符个数为1,字符组在一对中括号([…])中存放单个或多个需要匹配的字符, 也可以指定一段字符范围,之符之间为或的逻辑关系。
字符组常见匹配方式 | 注释 |
---|---|
[0-9] | 匹配所有数字 |
[a-z] | 匹配所有小写字母 |
[A-Z] | 匹配所有大写字母 |
[a-zA-Z] | 匹配所有大小写字母 |
[一-龥]或[\u4e00-\u9fa5] | 匹配所有汉字,龥(打字码rtt) |
[\d\w] | 匹配存放在字符组中的元字符 |
[^……] | 匹配非汉字,如[^一-龥] |
| | 逻辑或匹配,如a|d|n,表示只匹配这3个字母; |
|之间与可是表达式 |
import re
text= "小张34-小明16-欧阳一大明45-小曾32"
t=re.compile( "[一-龥]" )
p=t.findall(text)
print (p)
返回:
['小', '张', '小', '明', '欧', '阳', '一', '大', '明', '小', '曾']